/*
    C代码练习

    qsort函数的使用

    夏思成

    2024年3月16日

*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct student
{
    char name[64];
    int age;
};

int compare_int(const void* p1, const void* p2)//比较函数，由要比较的数据类型所决定，并且由使用者编写
{
    return *((int*)p1) - *((int*)p2);
}

int compare_struct_by_name(const void* p1, const void* p2)//比较函数，比较结构体类型中的名字
{
    return strcmp(((struct student*)p1)->name, ((struct student*)p2)->name);
}

int compare_struct_by_age(const void* p1, const void* p2)//比较函数，比较结构体类型中的年龄
{
    return ((struct student*)p1)->name - ((struct student*)p2)->name;
}

void print1(int* p, size_t size)
{
    int i = 0;
    for (i = 0; i < size; i++)
    {
        printf("%d ", p[i]);
    }
    printf("\n");
}

void print2(struct student* p, size_t size)
{
    int i = 0;
    for (i = 0; i < size; i++)
    {
        printf("%s,%d", p->name, p->age);
        printf("\n");
        p++;
    }
}

void test1()
{
    int nums[] = { 10,9,8,7,6,5,4,3,2,1 };
    int size = sizeof(nums) / sizeof(nums[0]);
    qsort(nums, size, sizeof(nums[0]), compare_int);//快速排序函数
    print1(nums, size);//打印函数
}

void test2()
{
    struct student stu[3] = { {"zhangsan",18},{"lisi",29},{"wangwu",89} };
    int size = sizeof(stu) / sizeof(stu[0]);
    qsort(stu, size, sizeof(stu[0]), compare_struct_by_name);
    print2(stu, size);
}

void test3()
{
    struct student stu[3] = { {"zhangsan",18},{"lisi",29},{"wangwu",89} };
    int size = sizeof(stu) / sizeof(stu[0]);
    qsort(stu, size, sizeof(stu[0]), compare_struct_by_age);
    print2(stu, size);

}

int main()
{
    test1();//排序整型数据

    test2();//排序结构体型数据,排序名字

    test3();//排序结构体型数据，排序年龄
    return 0;
}